#include <stdio.h>
// 宏的强大之处在于，它的名称后面可以使用括号，指定接受一个或多个参数。
#define SQUARE(X) X *X
// 如果宏的长度过长，可以使用反斜杠（\）折行，将宏写成多行。
#define PRINT_NUMS_TO_PRODUCT(a)       \
    {                                     \
        int product = SQUARE(a);          \
        for (int i = 0; i < product; i++) \
        {                                 \
            printf("%d\n", i);            \
        }                                 \
    }
void main(void)
{

    printf("%d\n", SQUARE(2));
    // 这种写法很像函数，但又不是函数，而是完全原样的替换，会跟函数有不一样的行为
    printf("%d\n", SQUARE(2 + 3)); // 结果是11，而不是25
    // 这是因为，预处理器只是简单地把SQUARE(2 + 3)替换成2 + 3 * 2 + 3，
    // 而不是2 + 3的平方。要避免这种问题，必须在宏定义时加上括号
    // #define SQUARE(X) ((X) * (X))

    printf("-------\n");
    PRINT_NUMS_TO_PRODUCT(2);
}